/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import io.Actualizacion;
import io.Asesoria;
import io.Calle;
import io.Caso;
import io.Comisaria;
import io.Copnaf;
import io.Direccion;
import io.InformacionAsesoria;
import io.InformacionCopnaf;
import io.InformacionJuzgado;
import io.InformacionServicioProteccionDerecho;
import io.Intervencion;
import io.IntervencionAdiccion;
import io.IntervencionComun;
import io.JuzgadoDeFamilia;
import io.Llamado;
import io.Nino_Adolescente;
import io.Operador;
import io.RelacionNinio;
import io.ServicioProteccionDerecho;
import io.TipoLlamado;
import io.TipoMotivo;
import io.TipoOrientacion;
import io.TipoSexo;
import io.TipoSustancia;
import io.TipoZona;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author NiCo
 */
public class ControladorCasos {

    public char verificar_datos(String nombre, String apellido, Long dni) {
        char valor = 0;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            valor = (Character) ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM ldld_verificar_datos('" + nombre + "', '" + apellido + "', " + dni + ")").getSingleResult();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return valor;
    }

    public long ultimo_caso() {
        long valor = 0;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            valor = Long.parseLong(ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM ldld_ultimo_caso()").getSingleResult().toString());
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return valor;
    }

    public void actualizar(Caso caso) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            Caso aux = ControladorPrincipal.getInstance().getEntity().find(Caso.class, caso.getNumeroCaso());
            aux = ControladorPrincipal.getInstance().getEntity().merge(caso);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public void actualizar(RelacionNinio relacion) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            RelacionNinio aux = ControladorPrincipal.getInstance().getEntity().find(RelacionNinio.class, relacion.getId());
            aux = ControladorPrincipal.getInstance().getEntity().merge(relacion);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public void actualizar(IntervencionComun intervencion) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            IntervencionComun aux = ControladorPrincipal.getInstance().getEntity().find(IntervencionComun.class, intervencion.getId());
            aux = ControladorPrincipal.getInstance().getEntity().merge(intervencion);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public void actualizar(InformacionServicioProteccionDerecho info) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            InformacionServicioProteccionDerecho aux = ControladorPrincipal.getInstance().getEntity().find(InformacionServicioProteccionDerecho.class, info.getId());
            aux = ControladorPrincipal.getInstance().getEntity().merge(info);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public void actualizar(InformacionAsesoria info) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            InformacionAsesoria aux = ControladorPrincipal.getInstance().getEntity().find(InformacionAsesoria.class, info.getId());
            aux = ControladorPrincipal.getInstance().getEntity().merge(info);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public void actualizar(InformacionCopnaf info) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            InformacionCopnaf aux = ControladorPrincipal.getInstance().getEntity().find(InformacionCopnaf.class, info.getId());
            aux = ControladorPrincipal.getInstance().getEntity().merge(info);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public void actualizar(InformacionJuzgado info) {
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            InformacionJuzgado aux = ControladorPrincipal.getInstance().getEntity().find(InformacionJuzgado.class, info.getId());
            aux = ControladorPrincipal.getInstance().getEntity().merge(info);
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();

        }
    }

    public List<Caso> listaCasos() {
        List<Caso> lista = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            lista = ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM CASO", Caso.class).getResultList();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return lista;
    }

    public List<Caso> buscarXNombre(String nombre, String apellido) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            Nino_Adolescente ninio = caso.getNino_adolescente();
            if (ninio.getNombre().toLowerCase().startsWith(nombre.toLowerCase()) && ninio.getApellido().toLowerCase().startsWith(apellido.toLowerCase())) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXEdad(int edad) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            Nino_Adolescente ninio = caso.getNino_adolescente();
            if (ninio.getEdad() == edad) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXDni(long dni) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            Nino_Adolescente ninio = caso.getNino_adolescente();
            if (ninio.getDni() == dni) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXSexo(TipoSexo tipoSexo) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            Nino_Adolescente ninio = caso.getNino_adolescente();
            if (ninio.getSexo() == tipoSexo) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXZona(TipoZona tipoZona) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            Nino_Adolescente ninio = caso.getNino_adolescente();
            if (ninio.getZona() == tipoZona) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXNroCaso(Long nroCaso) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (caso.toString().startsWith(nroCaso.toString())) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXMotivo(TipoMotivo tipoMotivo) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (caso.getMotivo() == tipoMotivo) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXOperador(Operador operador) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (caso.getOperador() == operador) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXViolencia(String violencia) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (caso.getMotivo().toString().equals(violencia)) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXAbordaje(String abordaje) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (abordaje.equals("102") && (caso.getOrientacion() == TipoOrientacion.ASESORADO_EN_LLAMADO || caso.getOrientacion() == TipoOrientacion.EQUIPO_102)) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            } else {
                if (abordaje.equals("Derivado") && caso.getOrientacion() == TipoOrientacion.DERIVADO) {
                    if (casos == null) {
                        casos = new ArrayList<Caso>();
                    }
                    casos.add(caso);
                }
            }
        }
        return casos;
    }

    public List<Caso> buscarXPeriodo(Date inicio, Date fin) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (caso.getFecha().compareTo(inicio) >= 0 && caso.getFecha().compareTo(fin) <= 0) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXFecha(Date fecha) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (caso.getFecha().equals(fecha)) {
                if (casos == null) {
                    casos = new ArrayList<Caso>();
                }
                casos.add(caso);
            }
        }
        return casos;
    }

    public List<Caso> buscarXSustancia(TipoSustancia tipoSustancia) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        while (it.hasNext()) {
            Caso caso = it.next();
            if (!caso.getIntervenciones().isEmpty() || caso.getIntervenciones() != null) {
                Iterator<Intervencion> it1 = caso.getIntervenciones().iterator();
                while (it1.hasNext()) {
                    Intervencion inter = it1.next();
                    try {
                        IntervencionAdiccion interAd = (IntervencionAdiccion) inter;
                        if (interAd.getSustanciaAbuso() == tipoSustancia) {
                            if (casos == null) {
                                casos = new ArrayList<Caso>();
                            }
                            casos.add(caso);
                        }
                    } catch (Exception e) {
                    }
                }
            }
        }
        return casos;
    }

    public List<Caso> buscarXDireccion(Calle calle, int nro, int piso, String dpto) {
        ArrayList<Caso> casos = null;
        Iterator<Caso> it = listaCasos().iterator();
        if (nro != -1 && piso != -1 && !dpto.equals("")) {
            while (it.hasNext()) {
                Caso caso = it.next();
                Direccion direccion = caso.getNino_adolescente().getDireccion();
                if (direccion.getCalle() == calle && direccion.getNuemero() == nro && direccion.getPiso() == piso && direccion.getDepartamento().equals(dpto)) {
                    if (casos == null) {
                        casos = new ArrayList<Caso>();
                    }
                    casos.add(caso);
                }
            }
        } else {
            if (nro == -1 && piso != -1 && !dpto.equals("")) {
                while (it.hasNext()) {
                    Caso caso = it.next();
                    Direccion direccion = caso.getNino_adolescente().getDireccion();
                    if (direccion.getPiso() == piso && direccion.getDepartamento().equals(dpto)) {
                        if (casos == null) {
                            casos = new ArrayList<Caso>();
                        }
                        casos.add(caso);
                    }
                }
            } else {
                if (nro != -1 && piso == -1 && dpto.equals("")) {
                    while (it.hasNext()) {
                        Caso caso = it.next();
                        Direccion direccion = caso.getNino_adolescente().getDireccion();
                        if (direccion.getCalle() == calle && direccion.getNuemero() == nro) {
                            if (casos == null) {
                                casos = new ArrayList<Caso>();
                            }
                            casos.add(caso);
                        }
                    }
                } else {
                    if (nro == -1 && piso == -1 && dpto.equals("")) {
                        while (it.hasNext()) {
                            Caso caso = it.next();
                            Direccion direccion = caso.getNino_adolescente().getDireccion();
                            if (direccion.getCalle() == calle) {
                                if (casos == null) {
                                    casos = new ArrayList<Caso>();
                                }
                                casos.add(caso);
                            }
                        }
                    }
                }
            }
        }
        return casos;
    }

    public List<Calle> listaCalles() {
        List<Calle> lista = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            lista = ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM calle ORDER BY nombre ASC", Calle.class).getResultList();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return lista;
    }

    public Comisaria existeComisaria(String nombre) {
        Comisaria com = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            com = (Comisaria) ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM COMISARIA WHERE nombre = '" + nombre + "'", Comisaria.class).getSingleResult();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return com;
    }

    public Copnaf existeCopnaf(String nombre) {
        Copnaf com = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            com = (Copnaf) ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM COPNAF WHERE nombre = '" + nombre + "'", Copnaf.class).getSingleResult();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return com;
    }

    public Asesoria existeAsesoria(String nombre) {
        Asesoria com = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            com = (Asesoria) ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM ASESORIA WHERE nombre = '" + nombre + "'", Asesoria.class).getSingleResult();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return com;
    }

    public JuzgadoDeFamilia existeJuzgado(String nombre) {
        JuzgadoDeFamilia com = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            com = (JuzgadoDeFamilia) ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM JUZGADODEFAMILIA WHERE nombre = '" + nombre + "'", JuzgadoDeFamilia.class).getSingleResult();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return com;
    }

    public ServicioProteccionDerecho existeServicioDerecho(String nombre) {
        ServicioProteccionDerecho com = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            com = (ServicioProteccionDerecho) ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM SERVICIOPROTECCIONDERECHO WHERE nombre = '" + nombre + "'", ServicioProteccionDerecho.class).getSingleResult();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return com;
    }

    public List<Llamado> llamadosPendientes() {
        List<Llamado> lista = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            lista = ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM LLAMADO WHERE pendiente = 'true'", Llamado.class).getResultList();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return lista;
    }

    public List<Llamado> otrosLlamados(Date fecha) {
        List<Llamado> lista = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            lista = ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM LLAMADO WHERE pendiente = 'false' AND fecha = '" + fecha + "'", Llamado.class).getResultList();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return lista;
    }

    public List<Llamado> eliminarLlamados(Date fecha) {
        List<Llamado> lista = new ArrayList<Llamado>();
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            List<Llamado> aux = ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM LLAMADO WHERE pendiente = 'false' AND fecha = '" + fecha + "'", Llamado.class).getResultList();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
            Iterator<Llamado> it = aux.iterator();
            while (it.hasNext()) {
                Llamado llamado = it.next();
                if (llamado.getCaso() == null && llamado.getActualizacion() == null) {
                    lista.add(llamado);
                }
            }
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return lista;
    }

    public List<Llamado> llamados(Date fecha) {
        List<Llamado> lista = null;
        ControladorPrincipal.getInstance().getEntity().getTransaction().begin();
        try {
            lista = ControladorPrincipal.getInstance().getEntity().createNativeQuery("SELECT * FROM LLAMADO WHERE fecha = '" + fecha + "'", Llamado.class).getResultList();
            ControladorPrincipal.getInstance().getEntity().getTransaction().commit();
        } catch (Exception e) {
            ControladorPrincipal.getInstance().getEntity().getTransaction().rollback();
        }
        return lista;
    }

    public ArrayList<Integer> estadisticas(List<Llamado> dia) {
        ArrayList<Integer> estadistica = new ArrayList<Integer>();
        estadistica.add(dia.size());
        Iterator<Llamado> it = dia.iterator();
        int casoTel = 0;
        int casoPEs = 0;
        int casoGTel = 0;
        int act = 0;
        int actGTel = 0;
        int relacionado = 0;
        int info = 0;
        while (it.hasNext()) {
            Llamado llamado = it.next();
            if (llamado.getCaso() != null) {
                Caso caso = llamado.getCaso();
                if (caso.getTipoCaso() == TipoLlamado.LLAMADO) {
                    casoTel++;
                } else {
                    if (caso.getTipoCaso() == TipoLlamado.GUARDIA_TELEFONICA) {
                        casoGTel++;
                    } else {
                        if (caso.getTipoCaso() == TipoLlamado.PRESENTACION_ESPONTANEA) {
                            casoPEs++;
                        }
                    }
                }
                Nino_Adolescente nino = llamado.getCaso().getNino_adolescente();
                int indiceCaso = nino.getCasos().indexOf(llamado.getCaso());
                if (indiceCaso > 0) {
                    relacionado++;
                }
            }
            if (llamado.getActualizacion() != null) {
                act++;
                Actualizacion actu = llamado.getActualizacion();
                if (actu.getTipoLlamado() == TipoLlamado.GUARDIA_TELEFONICA) {
                    actGTel++;
                }
            }
            if (llamado.isInfo_asesoramiento()) {
                info++;
            }
        }
        estadistica.add(casoTel);
        estadistica.add(casoPEs);
        estadistica.add(casoGTel);
        estadistica.add(act);
        estadistica.add(actGTel);
        estadistica.add(relacionado);
        estadistica.add(info);
        return estadistica;
    }
}
